﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "CollaborationCacheInterface.h"

namespace gcmp
{
    class IDocument;

    /// \brief ElementVersion工具类
    class COLLABORATION_CACHE_INTERFACE_EXPORT ElementVersionUtils final
    {
    public:
        /// \brief 根据ElementId从缓存中获取Element版本号
        ///
        /// ElementId不在缓存中，返回-1
        ///
        /// \param pDocment 文档指针
        /// \param elementId 需要获取版本的ElementId
        /// \return Int32 对应Element的版本
        static Int32 GetElementVersion(const IDocument* pDocment, const ElementId& elementId);

        /// \brief 根据ElementIds批量从缓存中获取Element版本号
        ///
        /// ElementId不在缓存中，版本号为-1
        ///
        /// \param pDocment 文档指针
        /// \param elementIds 需要获取版本的批量ElementIds
        /// \return std::unordered_map<ElementId, Int32, ElementIdHash> 批量获取的ElementId及对应版本号
        static std::unordered_map<ElementId, Int32, ElementIdHash> GetElementsVersion(const IDocument* pDocment, const std::vector<ElementId>& elementIds);

        /// \brief 获取缓存中所有Element的版本号
        ///
        /// \param pDocment 文档指针
        /// \return std::unordered_map<ElementId, Int32, ElementIdHash> 缓存中所有ElementId及对应版本号
        static const std::unordered_map<ElementId, Int32, ElementIdHash> * GetAllElementsVersion(const IDocument* pDocment);

        /// \brief 根据ElementId向缓存中设置Element版本号
        ///
        /// 不存在添加，存在用新值覆盖
        ///
        /// \param pDocment 文档指针
        /// \param elementId 需要设置版本的ElementId
        /// \param version 版本号
        /// \return void
        static void SetElementVersion(IDocument* pDocment, const ElementId& elementId, Int32 version);

        /// \brief 根据ElementIds批量向缓存中设置Element版本号
        ///
        /// 不存在添加，存在用新值覆盖
        ///
        /// \param pDocment 文档指针
        /// \param elementsVersion 需要设置版本的ElementIds及对应版本号
        /// \return void
        static void SetElementsVersion(IDocument* pDocment, const std::unordered_map<ElementId, Int32, ElementIdHash>& elementsVersion);

        /// \brief 根据ElementIds删除缓存中Element版本号
        ///
        /// \param pDocment 文档指针
        /// \param elementId 需要删除版本号的ElementId
        /// \return void
        static void DeleteElementVersion(IDocument* pDocment, const ElementId& elementId);

        /// \brief 根据ElementIds批量删除缓存中Element版本号
        ///
        /// \param pDocment 文档指针
        /// \param elementId 需要删除版本号的批量ElementId
        /// \return void
        static void DeleteElementsVersion(IDocument* pDocment, const std::vector<ElementId>& elementIds);
    };
}


